home *** CD-ROM | disk | FTP | other *** search
Text File | 1993-10-01 | 2.8 KB | 142 lines | [TEXT/PJMM] |
- unit MyTranslations;
-
- interface
-
- uses
- MyTypes;
-
- type
- transTable = packed array[char] of char;
-
- procedure GetTransTable (id: integer; out: boolean; var trans: transTable);
- procedure TranslateBlock (p: ptr; count: longInt; var trans: transTable);
- procedure TranslateHandle (h: handle; var trans: transTable);
- procedure TranslateString (var s: string; var trans: transTable);
- procedure TranslateEOLs (h: handle; dest: CRLFTypes);
-
- implementation
-
- const
- translateResType = 'taBL';
-
- {$R-}
-
- procedure GetTransTable (id: integer; out: boolean; var trans: transTable);
- var
- th: handle;
- tfs: FSSpec;
- tres, i: integer;
- begin
- th := GetResource(translateResType, id);
- if (th = nil) or (GetHandleSize(th) <> 512) then begin
- for i := 0 to 255 do begin
- trans[chr(i)] := chr(i);
- end;
- end
- else begin
- BlockMove(ptr(ord(th^) + SizeOf(trans) * ord(out)), @trans, SizeOf(trans));
- end;
- end;
-
- procedure TranslateBlock (p: ptr; count: longInt; var trans: transTable);
- var
- i: longInt;
- begin
- for i := 1 to count do begin
- p^ := ord(trans[chr(BAND(p^, $FF))]);
- p := ptr(ord(p) + 1);
- end;
- end;
-
- procedure TranslateHandle (h: handle; var trans: transTable);
- begin
- TranslateBlock(h^, GetHandleSize(h), trans);
- end;
-
- procedure TranslateString (var s: string; var trans: transTable);
- var
- i: integer;
- begin
- for i := 1 to length(s) do begin
- s[i] := trans[s[i]];
- end;
- end;
-
- procedure TranslateToOne (h: handle; crlf: CRLFTypes; var lines: longInt);
- var
- p, q: ptr;
- len, newlen, i: longInt;
- which: integer;
- begin
- len := GetHandleSize(h);
- lines := 0;
- if crlf = CL_CR then begin
- which := 13;
- end
- else begin
- which := 10;
- end;
- p := h^;
- q := h^;
- i := 1;
- newlen := 0;
- while i <= len do begin
- if p^ = 13 then begin
- q^ := which;
- lines := lines + 1;
- p := ptr(ord(p) + 1);
- if p^ = 10 then begin
- p := ptr(ord(p) + 1);
- end;
- end
- else if p^ = 10 then begin
- q^ := which;
- lines := lines + 1;
- p := ptr(ord(p) + 1);
- end
- else begin
- q^ := p^;
- p := ptr(ord(p) + 1);
- end;
- q := ptr(ord(q) + 1);
- newlen := newlen + 1;
- i := i + 1;
- end;
- SetHandleSize(h, newlen);
- end;
-
- procedure TranslateCRtoCRLF (h: handle; lines: longInt);
- var
- p, q: ptr;
- len, i: longInt;
- which: integer;
- begin
- len := GetHandleSize(h);
- SetHandleSize(h, len + lines);
- p := ptr(ord(h^) + len);
- q := ptr(ord(h^) + len + lines);
- for i := 1 to len do begin
- p := ptr(ord(p) - 1);
- if p^ = 13 then begin
- q := ptr(ord(q) - 1);
- q^ := 10;
- end;
- q := ptr(ord(q) - 1);
- q^ := p^;
- end;
- end;
-
- procedure TranslateEOLs (h: handle; dest: CRLFTypes);
- var
- lines: longInt;
- begin
- if dest = CL_CRLF then begin
- TranslateToOne(h, CL_CR, lines);
- TranslateCRtoCRLF(h, lines);
- end
- else begin
- TranslateToOne(h, dest, lines);
- end;
- end;
-
- end.